#include<stdio.h>
#include<stdbool.h>

#define Size 3





//初始化函数：对操作对象的初始状态赋值
void InitBoard( char (*Board)[Size] )
{
    for(int i=0;i<Size;i++)
    {
        for(int j=0;j<Size;j++)
        {
            Board[i][j]=' ';
        }
    }
}

//打印棋盘
void PrintBoard(char (*Board)[Size])
{
    for(int i=0;i<Size;i++)
    {
        for(int j=0;j<Size;j++)
        {
            printf(" %c",Board[i][j]);
            if(j < Size-1)
            printf("|");
        }
        printf("\n");
        if(i<Size-1)
        printf("--|--|--\n");
    }
}

// 下棋的函数
bool MakeMove(char(*Board)[Size],int row, int columnn, char player)
{
    //非法位置
    if(row < 0 || row>=Size || columnn<0 || columnn>=Size)
    {
        printf("非法的下棋位置，请重新输入！\n");
        return false;
    }
    if(Board[row][columnn] != ' ')
    {
        printf("该位置已经有棋子了，请重新选择位置！\n");
        return false;
    }
    Board[row][columnn] = player;
    return true;

}

//判断获胜
bool CheckIsWin(char (*Board)[Size],char player)
{
    for(int i=0;i<Size;i++)
    {
        if(Board[i][0] == player &&
           Board[i][1] == player &&
           Board[i][2] == player )
        {
            return true;
        }

    }
    
    for(int i=0;i<Size;i++)
    {
        if(Board[0][i] == player &&
           Board[1][i] == player &&
           Board[2][i] == player )
        {
            return true;
        }

    }
    if(Board[0][2] == player &&
       Board[1][1] == player &&
       Board[2][0] == player )
    {
        return true;
    }

    if(Board[2][0] == player &&
        Board[1][1] == player &&
        Board[0][2] == player )
    {
        return true;
    }

    return false;

}


//判断平局
bool CheckIsDraw(char (*Board)[Size])
{
    for(int i=0 ;i<Size;i++)
    {
        for(int j=0;j<Size;j++)
        {
            if(Board[i][j]==' ');
            return false;
        } 
    }
    return true;
}






int main()
{
    char Board[Size][Size] = {0};

    InitBoard(Board);
    // PrintBoard(Board);

    char player = 'x';
    while(1)
    {
        PrintBoard(Board);
        int row =0,column = 0;
        printf("请|%c|选手下棋：",player);

        //从终端读取输入
        //阻塞函数：会让程序进入等待状态，直到收到输入才会继续执行程序
        scanf("%d %d",&row,&column);
        if(MakeMove(Board,row,column,player)==false)
        {
            continue;
        }
        
        if((CheckIsWin(Board,player)==true))
        {
            
            printf("恭喜|%c|选手获胜！\n",player);
            PrintBoard(Board);
            break;
        }
        if(CheckIsDraw(Board))
        {
            PrintBoard(Board);
            printf("平局！\n");
            break;
        }
        //换边
        player = (player == 'x')? '0':'x';



    }





    return 0;
}